/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ingresos;
import javax.persistence.EntityManagerFactory;
import Entidades.Carrera;
import Controladores.CarreraJpaController;
import Controladores.FacultadJpaController;
import Controladores.exceptions.IllegalOrphanException;
import Controladores.exceptions.NonexistentEntityException;
import Entidades.Asignacionciclocarrera;
import Entidades.Ciclo;
import java.util.logging.Level;
import java.util.logging.Logger;
import Usuarios.conexion;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author a Victor Jose Betancohurt Hoffens
 */
public class ICarrera  
{
    
    public ICarrera()
    {
    }
    //procedimiento guardar para la creacion de las tabla Carrera por victor 
    public void guardar(String nombre,int idFacultad, int numCiclos)
    {
        Carrera carrera = new Carrera();
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        CarreraJpaController controlador = new CarreraJpaController(emf);
        carrera.setNombre(nombre);
        FacultadJpaController controaldorFactulad = new FacultadJpaController(emf);
        carrera.setFacultadidFacultad(controaldorFactulad.findFacultad(idFacultad));
        carrera.setAnulado(false);
        controlador.create(carrera);
        carrera = this.buscarNombre(carrera.getNombre()).get(0);
        asignarCiclos(numCiclos,carrera);
    }
    public void asignarCiclos(int numCiclos, Carrera carrera){
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        Query qr;
        qr = em.createNamedQuery("Ciclo.findCiclos");
        qr.setParameter("numeroCiclo", numCiclos);
        List<Ciclo> lista = qr.getResultList();
        for(int i=0; i < lista.size(); i++){
            IAsignacionCicloCarrera manejo = new IAsignacionCicloCarrera();
            manejo.guardar(lista.get(i), carrera);
        }
        
    }
    //procedimiento para modificar la tabla Carrera por victor
    public void modificar(Carrera carrera, int numCiclos)
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        CarreraJpaController controlador = new CarreraJpaController(emf);
        try {
            controlador.edit(carrera);
            if(carrera.getAsignacionciclocarreraCollection().size() < numCiclos){
                EntityManager em = emf.createEntityManager();
                Query qr;
                qr = em.createNamedQuery("Ciclo.findCiclos");
                qr.setParameter("numeroCiclo", numCiclos);
                List<Ciclo> lista = qr.getResultList();              
                for(int i=carrera.getAsignacionciclocarreraCollection().size(); i < lista.size(); i++){
                    IAsignacionCicloCarrera manejo = new IAsignacionCicloCarrera();
                    manejo.guardar(lista.get(i), carrera);
                }
        
            }
            if(carrera.getAsignacionciclocarreraCollection().size() > numCiclos){
                for(int i=numCiclos; i < carrera.getAsignacionciclocarreraCollection().size(); i++){
                    Asignacionciclocarrera registro = (Asignacionciclocarrera) carrera.getAsignacionciclocarreraCollection().toArray()[i];
                    IAsignacionCicloCarrera manejo = new IAsignacionCicloCarrera();
                    manejo.eliminarByID(registro.getCicloidCiclo(), registro.getCarreraidCarrera());
                }
            }
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void modificar(Carrera carrera)
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        CarreraJpaController controlador = new CarreraJpaController(emf);
        try {
            controlador.edit(carrera);
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ICarrera.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //funcion buscar por ID que regresa una clases Carrera hecho por victor
    public Carrera buscarId(int id)
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        CarreraJpaController controlador = new CarreraJpaController(emf);
        return controlador.findCarrera(id);
    }
    //funcion buscar por nombre regres una lista de tipo Carrera
    public List<Carrera> buscarNombre(String nombre)
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        Query qr;
        qr = em.createNamedQuery("Carrera.findByNombre");
        qr.setParameter("nombre", nombre);
        List<Carrera> lista = qr.getResultList();
        return lista;
    }
    public List<Carrera> mostrarTodo()
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        CarreraJpaController controlador = new CarreraJpaController(emf);
        return controlador.findCarreraEntities();
    }
    public List<Carrera> mostrarTodoFalse()
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        Query qr;
        qr = em.createNamedQuery("Carrera.findByAnulado");
        qr.setParameter("anulado", false);
        List<Carrera> lista = qr.getResultList();
        return lista;
    }
    
    public List<Carrera> mostrarTodoTrue()
    {
        EntityManagerFactory emf = conexion.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        Query qr;
        qr = em.createNamedQuery("Carrera.findByAnulado");
        qr.setParameter("Anulado",true);
        List<Carrera> lista = qr.getResultList();
        return lista;
    }
    
    public String toString(int id)
    {
        Carrera carrera=this.buscarId(id);
        return carrera.toString();
    }
}
